计算机网络的课程设计,编写一个程序,或利用某些程序,检测局域网内的IP地址冲突,思路如下:
自己不是IP地址的冲突者,但是有可能引起冲突,利用scapy包的arp函数,发送arp报文,获得局域网内所有IP,以及对应的Mac地址,当然,这个arp请求必须发送多次,如果只发送一次的话,那么可能只有一个相同IP的主机返回了,无法判断冲突,可以在较短时间内多次发送(不可能每次都是相同IP的同一个主机返回),如果这个时间段内,同一个IP地址对应多个Mac地址,那么存在IP地址冲突。
首先,查看自己的手机的IP地址:
可以看到,手机的IP地址是192.168.1.2
我们可以将Win7的IP地址改成上面的IP地址。
这时候,在另外一台系统为Ubuntu14.04的电脑上运行程序,就检测局域网内的IP地址冲突。
Python代码如下(arp包用的是广播发送,目的Mac地址为全F):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| #!/usr/bin/env python # -*- coding:utf-8 -*- from scapy.all import srp,Ether,ARP,conf,get_if_hwaddr,get_if_addr import time
ipscan='192.168.1.1/24'
import socket import fcntl import struct
def ip_conflict(): start = time.clock() # print "start time", start ip_dict = dict() conf = False ip_me = get_if_addr('wlan0') mac_me = get_if_hwaddr('wlan0') ip_dict[ip_me] = mac_me while True: end = time.clock() # print "endtime",end # print "??:" # print int(end-start) if int(end-start) > 1: # print ('Timeout!!!') break try: ans,unans=srp(Ether(dst="FF:FF:FF:FF:FF:FF")/ARP(pdst=ipscan),timeout=2,verbose=False) except Exception,e: print str(e) else: print (" MAC -- IP ") for snd,rcv in ans: list_mac=rcv.sprintf("%Ether.src% -- %ARP.psrc%") mac = rcv.sprintf("%Ether.src%") ip = rcv.sprintf("%ARP.psrc%") if ip not in ip_dict: ip_dict[ip] = mac else: if mac != ip_dict[ip]: print "**************存在ip地址冲突*************" if ip == ip_me: print "IP地址为:",ip print "与本机的ip地址冲突" print "冲突的mac地址",mac_me,ip_dict[ip] conf = True else: print "" print "IP地址为:",ip print "冲突的mac地址为",mac,ip_dict[ip] conf = True print "*****************************************" print list_mac print "\nIP地址,MAC地址对应关系列表" print " ip MAC" for has_ip in ip_dict.keys(): print has_ip, "------ " + ip_dict[has_ip] if conf is True: print "\n当前局域网内没有IP地址冲突\n"
print "\n当前的局域网内的IP地址有:" for has_ip in ip_dict.keys(): print has_ip print "\n如果要修改IP地址,注意不要改为上述的IP地址,否则会有IP冲突\n"
print "欢迎使用IP地址检测程序V0.1" print "该程序可以检测到局域网内的IP地址冲突,可以将局\n域网内的所有IP显示出来,防止修改本机IP后发生IP地址冲突\n\n" print "开始检测:" ip_conflict() # print get_if_hwaddr('wlan0') # print get_if_addr('wlan0') # print "byebye"
|
在修改IP前,用Ubuntu主机检测冲突,没有IP地址冲突:
修改Win7的IP地址:
修改Win7的IP后,再用Ubuntu主机检测冲突,可以检测到IP地址冲突
再检测一次,这一次我们抓包看看,这次手机的IP地址为192.168.1.4,Win7的IP地址为192.168.1.13,修改IP地址前,我们运行程序,同时抓包查看发送的arp内容:
针对Win7:
针对iPhone:
win7的回应:
iPhone的回应:
修改Win7的IP后:
再次运行程序,可以抓取到arp报文,可以发现IP冲突:
同时,该程序也能检测到IP冲突:
如果是两台PC产生了IP冲突:
依然可以修改IP地址:
r
一台是宏碁:
一台是联想:
运行程序,可以检测到IP冲突: